package cn.itcast.demo;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

import cn.itcast.domain.Customer;
import cn.itcast.utils.HibernateUtils;

public class CustomerDemo
{
	@Test // 使用hibernate提供的api来操作
	public void test1()
	{
		// 加载数据库的核心配置文件 (引入映射文件)
		Configuration configuration = new Configuration();
		configuration.configure();
		// 手动加载映射文件
		//configuration.addResource("cn/itcast/domain/Customer.hbm.xml");
		// 获取sessionFactory  session工厂
		SessionFactory sessionFactory = configuration.buildSessionFactory();
		// 获取session  相当于connection
		Session session = sessionFactory.openSession();
		// 开启事务 (小细节:hibernate对增删改一条sql语句 都得开事务手动提交一次)
		Transaction tx = session.beginTransaction();
		// 操作 (存一条数据到cst_customer)
		Customer customer = new Customer();
		customer.setCust_name("rose");
		session.save(customer);
		// 提交
		tx.commit();
		// 关闭连接
		session.close();
		// 关闭连接池
		sessionFactory.close();
		
	}
	
	
	@Test
	public void test2()
	{
		// 加载数据库的核心配置文件
		Configuration configuration = new Configuration();
		configuration.configure();
		// 获取sessionFactory
		SessionFactory sessionFactory = configuration.buildSessionFactory();
		// 获取连接
		Session session = sessionFactory.openSession();
		// 开启事务
		Transaction tx = session.beginTransaction();
		
		// 操作  查询  主键查询  hibernate会自动生成sql语句
		Customer customer = session.get(Customer.class, 2L);
		System.out.println(customer);
		
		/*Customer customer = session.load(Customer.class, 2L);
		System.out.println(customer);*/
		
		/*get查询和load查询的区别: 都是根据id主键查询  面试题
		 * 	     核心点:
		 * 	      get查询是立即查询   只要查询就立马发送sql语句获取所有数据
		 * 	      load是延迟查询       查询时候不会立马发送sql语句去查  当使用到这些数据的时候才会去查
		 * 
		 * 		  
		 * 		  get查询返回的是Customer类型
		 * 		  load查询返回的是Custoemr代理类型
		 * 
		 * 		  get查询找不到返回null
		 * 		  load查询找不到返回的报错信息
		 * 			
		 * */
				
		
		// 提交事务
		tx.commit();
		// 关闭连接
		session.close();
	}
	
	
	
	@Test
	public void test3()
	{
		// 加载核心数据库配置文件
		Configuration configuration = new Configuration();
		configuration.configure();
		// 获取sessionFactory 连接池
		SessionFactory sessionFatory = configuration.buildSessionFactory();
		// 获取连接
		Session session = sessionFatory.openSession();
		// 开启事务
		Transaction tx = session.beginTransaction();
		
		// 修改  (面相对象思想   操作对象就像相当于操作数据库)
		/*Customer customer = new Customer();
		customer.setCust_id(1L);
		customer.setCust_name("jacka");
		session.update(customer);
		*/
		
		// 修改就要先查后修改
		Customer customer = session.get(Customer.class, 1L);
		customer.setCust_name("rosessssss");
			
		session.update(customer);
		
		// 提交事务
		tx.commit();
		// 关闭连接
		session.close();
	}
	
	@Test
	public void test4()
	{
		// 获取连接
		Session session = HibernateUtils.openSession();
		// 开启事务
		Transaction tx = session.beginTransaction();
		// 操作 (删除--先查后删)
		Customer customer = session.get(Customer.class, 1L);
		session.delete(customer);
		// 提交
		tx.commit();
		// 关闭
		session.close();
		
	}
	
}
